#include "rar.hpp"

BitInput::BitInput(bool AllocBuffer)
{
    ExternalBuffer=false;
    if (AllocBuffer)
    {
        // getbits32 attempts to read data from InAddr, ... InAddr+3 positions.
        // So let's allocate 3 additional bytes for situation, when we need to
        // read only 1 byte from the last position of buffer and avoid a crash
        // from access to next 3 bytes, which contents we do not need.
        size_t BufSize=MAX_SIZE+3;
        InBuf=new byte[BufSize];

        // Ensure that we get predictable results when accessing bytes in area
        // not filled with read data.
        memset(InBuf,0,BufSize);
    }
    else
        InBuf=NULL;
}

BitInput::~BitInput()
{
    if (!ExternalBuffer)
        delete[] InBuf;
}

void BitInput::handle_mem_error( Rar_Error_Handler& ErrHandler )
{
	if ( !InBuf )
		ErrHandler.MemoryError();
}

void BitInput::faddbits(uint Bits)
{
    // Function wrapped version of inline addbits to save code size.
	addbits(Bits);
}


uint BitInput::fgetbits()
{
    // Function wrapped version of inline getbits to save code size.
    return(getbits());
}


void BitInput::SetExternalBuffer(byte *Buf)
{
    if (InBuf!=NULL && !ExternalBuffer)
        delete[] InBuf;
    InBuf=Buf;
    ExternalBuffer=true;
}

